<?php

/**
 * Class MY_Model
 * 数据库核心类，用来连接数据库与数据库基本操作
 */
class MY_Model extends CI_Model
{

	private $DB;// 数据库连接类
	private $DB_database; //要连接数据库的database数据库配置文件名
	private $db_names = array(); // 传入的数据库表名称数组
	private $db_primarys = array(); // 传入的数据库表的每个主键

	public function __construct($DB_database, $db_names = [""], $db_primarys = ["id"])
	{
		parent::__construct();

		// 判断数据库表名是否为空
		if ($db_names[0] == "" || $db_names == null) {
			return;
		}
		$this->db_names = $db_names; //保存数据库表名称
		$this->db_primarys = $db_primarys; //保存数据库主键
		$this->DB = $this->load->database("$DB_database", TRUE);
	}

	//为db的查询添加条件
	private function add_conditions($cont)
	{
		if ($cont == null) {
			return;
		}

		/**
		 * 例子：
		 * array('name' => $name, 'title' => $title, 'status' => $status); where('id <', $id);
		 * 支持比较运算符  array('name !=' => $name, 'id <' => $id, 'date >' => $date);
		 */
		//如果where存在 添加where查询条件
		if (isset($cont["where"])) {
			$this->DB->where($cont["where"]);
			unset($cont["where"]);
		}

		if (isset($cont["or_where"])) {
			foreach ($cont["or_where"] as $value) {
				$this->DB->or_where($value);  // Produces: WHERE name != 'Joe' OR id > 50
			}
			unset($cont["or_where"]);
		}

		/**
		 * 例子：//如果like条件存在，添加排序条件
		 * array('title' => $match, 'page1' => $match, 'page2' => $match);  使用and连接每个like
		 */
		if (isset($cont["like"])) {
			$this->DB->like($cont["like"]);
			unset($cont["like"]);
		}

		/**
		 * 如果要多个like，并且 或 的话
		 * $cont = [
		 * "or_like" => [
		 * 'name' => 'A',
		 * 'id' => '2'
		 * ]
		 * ];
		 */
		if (isset($cont["or_like"]) && count($cont["or_like"]) > 1) {
			$i = 0;
			foreach ($cont["or_like"] as $key => $value) {
				if ($i == 0) {
					$this->DB->like($key, $value);
					echo "添加like成功" . PHP_EOL;
				}
				$this->DB->or_like($key, $value);
				echo "添加or_like成功" . PHP_EOL;
				$i++;
			}
			unset($cont["or_like"]);
			unset($i);
		}

		/**
		 * 排序order_by 例子：array('title' => 'ASC', 'page1' => 'DESC', 'page2' => 'DESC');
		 */
		if (isset($cont["order_by"])) {
			foreach ($cont["order_by"] as $key => $value) {
				$this->DB->order_by($key, $value);
			}
			unset($cont["order_by"]);
		}

		/**
		 * 分组group_by 例子：array("title", "date")
		 */
		if (isset($cont["group_by"])) {
			$this->DB->group_by($cont["group_by"]);
			unset($cont["group_by"]);
		}

		/**
		 * 分页与计数 array(10, 100);
		 */
		if (isset($cont["limit"])) {
			if (!count($cont["limit"]) == 2) {
				echo "退出了limit";
				return;
			}
//			$this->DB->limit($cont["limit"][0], $cont["limit"][1]);
			$this->DB->limit($cont["limit"][1], $cont["limit"][0]);
			unset($cont["limit"]);
		}
	}

	// 获取数量
	public function get_conunt($cont = null)
	{
		$this->add_conditions($cont);
		//返回数量 int
		//return $this->DB->count_all_results($cont['table']);
		//判断用户是否传入’table‘，如果没有就获取实例化时的表名称。
		return $this->DB->count_all_results(isset($cont['table']) ? $cont['table'] : $this->db_names[0]);
	}

	// 查询所有结果
	public function select_all($cont)
	{
		$this->add_conditions($cont);
		//$this->DB->from($cont['table']);
		//1
		$this->DB->from(isset($cont['table']) ? $cont['table'] : $this->db_names[0]);
		// 生成结果且 通过result_array 返回数组;
		$query = $this->DB->get();
		return $query->result_array();
	}

	// 查询数据，并且添加查询条件
	public function select_form($cont = null)
	{
		$this->add_conditions($cont); //添加各种查询条件
//		$this->DB->from($cont['table']);
		$this->DB->from(isset($cont['table']) ? $cont['table'] : $this->db_names[0]);

		// 生成结果且 通过result_array 返回数组;
		$query = $this->DB->get();
		return $query->result_array();
	}


	/**
	 * //插入一条数据
	 * $cont=[
	 * "table"=>'admin',
	 * "data"=>[
	 * 'title' => 'My title',
	 * 'name' => 'My Name',
	 * 'date' => 'My date'
	 * ]
	 * ];
	 */
	public function insert_one($cont)
	{
		if (!isset($cont) || !isset($cont['data'])) {
			return;
		}
		//$this->DB->insert($cont['table'], $cont['data']);
		$this->DB->insert(isset($cont['table']) ? $cont['table'] : $this->db_names[0], $cont['data']);
		return $this->DB->affected_rows(); // 返回，当执行 INSERT、UPDATE 等写类型的语句时，这个方法返回受影响的行数。
	}

	/**
	 * 插入多个数据，（数组）
	 * "table"=>'admin'
	 * array(
	 * 'title' => 'My title',
	 * 'name' => 'My Name',
	 * 'date' => 'My date'
	 * ),
	 * array(
	 * 'title' => 'Another title',
	 * 'name' => 'Another Name',
	 * 'date' => 'Another date'
	 * )
	 */
	public function insert_batch($cont)
	{
		if (!isset($cont) || !isset($cont['data'])) {
			return;
		}
		//$this->DB->insert_batch($cont['table'], $cont['data']);
		$this->DB->insert_batch(isset($cont['table']) ? $cont['table'] : $this->db_names[0], $cont['data']);
		return $this->DB->affected_rows(); // 返回，当执行 INSERT、UPDATE 等写类型的语句时，这个方法返回受影响的行数。
	}

	/**
	 * 更新数据 方法1 标准的 DELETE + INSERT
	 */
	public function replace($cont)
	{
		if (!isset($cont) || !isset($cont['data'])) {
			return;
		}
		//$this->DB->replace($cont['table'], $cont['data']);
		$this->DB->replace(isset($cont['table']) ? $cont['table'] : $this->db_names[0], $cont['data'], $cont['data']);
		return $this->DB->affected_rows(); // 返回，当执行 INSERT、UPDATE 等写类型的语句时，这个方法返回受影响的行数。
	}

	/**
	 *更新数据 方法1 标准的update
	 */
	public function update($cont)
	{
		if (!isset($cont) || !isset($cont['data']) || !isset($cont['where'])) {
			return;
		}
		$this->DB->where($cont['where']);
		//$this->DB->update($cont['table'], $cont['data']);
		$this->DB->update(isset($cont['table']) ? $cont['table'] : $this->db_names[0], $cont['data']);
		return $this->DB->affected_rows(); // 返回，当执行 INSERT、UPDATE 等写类型的语句时，这个方法返回受影响的行数。
	}

	/**
	 * 更新多条数据 方法1 标准的update
	 */
	public function update_batch($cont)
	{
		/**
		 * $data = array(
		 * array(
		 * 'title' => 'My title' ,
		 * 'name' => 'My Name 2' ,
		 * 'date' => 'My date 2'
		 * ),
		 * array(
		 * 'title' => 'Another title' ,
		 * 'name' => 'Another Name 2' ,
		 * 'date' => 'Another date 2'
		 * )
		 * );
		 *
		 * $this->db->update_batch('mytable', $data, 'title');
		 */
		if (!isset($cont) || !isset($cont['data']) || !isset($cont['where'])) {
			return;
		}
		//$this->DB->update_batch($cont['table'], $cont['data'], $cont['where']);
		$this->DB->update_batch(isset($cont['table']) ? $cont['table'] : $this->db_names[0], $cont['data'], $cont['where']);
		return $this->DB->affected_rows(); // 返回，当执行 INSERT、UPDATE 等写类型的语句时，这个方法返回受影响的行数。
	}

	/**
	 * 删除数据 方法1 删除数据
	 */
	public function delete($cont)
	{
		if (!isset($cont)) {
			return;
		}
		if (isset($cont['where'])) {
			$this->DB->where($cont['where']);
		}

		if (isset($cont["or_where"])) {
			foreach ($cont["or_where"] as $value) {
				$this->DB->or_where($value);  // 累加or where 数据
			}
		}
		//$this->DB->delete($cont['table']);
		$this->DB->delete(isset($cont['table']) ? $cont['table'] : $this->db_names[0]);
		return $this->DB->affected_rows(); // 返回，当执行 INSERT、UPDATE 等写类型的语句时，这个方法返回受影响的行数。
	}

	/**
	 * 删除一个表中的所有数据 方法1
	 */
	public function delete_empty_table($cont)
	{
		if (!isset($cont)) {
			return;
		}
		//$this->DB->empty_table($cont['table']); // Produces: DELETE FROM mytable
		$this->DB->empty_table(isset($cont['table']) ? $cont['table'] : $this->db_names[0]);
		return $this->DB->affected_rows(); // 返回，当执行 INSERT、UPDATE 等写类型的语句时，这个方法返回受影响的行数。
	}

	/**
	 * 删除一个表中的所有数据 方法2
	 */
	public function delete_truncate()
	{
		if (!isset($cont)) {
			return;
		}
//		$this->DB->truncate($cont['table']);
		$this->DB->truncate(isset($cont['table']) ? $cont['table'] : $this->db_names[0]);
		return $this->DB->affected_rows(); // 返回，当执行 INSERT、UPDATE 等写类型的语句时，这个方法返回受影响的行数。
	}
}
